﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Kokomo.PeInspector.VisualStudioAdapter
{
	/// <summary>
	/// Represents a property group containing the basic project settings
	/// </summary>
	/// <remarks>
	/// The list of basic propercties include:
	/// <list type="bulleted">
	/// <item><see cref="ConfigurationProperty"/></item>
	/// <item><see cref="PlatformProperty"/></item>
	/// <item><see cref="ProductVersionProperty"/></item>
	/// <item><see cref="SchemaVersionProperty"/></item>
	/// <item><see cref="ProjectGuidProperty"/></item>
	/// <item><see cref="OutputTypeProperty"/></item>
	/// <item><see cref="AppDesignerFolderProperty"/></item>
	/// <item><see cref="RootNamespaceProperty"/></item>
	/// <item><see cref="AssemblyNameProperty"/></item>
	/// <item><see cref="TargetFrameworkVersionProperty"/></item>
	/// <item><see cref="FileAlignmentProperty"/></item>
	/// <item><see cref="SccProjectNameProperty"/></item>
	/// <item><see cref="SccLocalPathProperty"/></item>
	/// <item><see cref="SccAuxPathProperty"/></item>
	/// <item><see cref="SccProviderProperty"/></item>
	/// </list>
	/// </remarks>
	public class BasicPropertyGroup : PropertyGroup
	{
		public BasicPropertyGroup()
		{
			this.ConfigurationProperty = new Property("Configuration");
			this.PlatformProperty = new Property("Platform");
			this.ProductVersionProperty = new Property("ProductVersion");
			this.SchemaVersionProperty = new Property("SchemaVersion");
			this.ProjectGuidProperty = new Property("ProjectGuid");
			this.OutputTypeProperty = new Property("OutputType");
			this.AppDesignerFolderProperty = new Property("AppDesignFolder");
			this.RootNamespaceProperty = new Property("RootNamespace");
			this.AssemblyNameProperty = new Property("AssemblyName");
			this.TargetFrameworkVersionProperty = new Property("TargetFrameworkVersion");
			this.FileAlignmentProperty = new Property("FileAlignment");
			this.SccProjectNameProperty = new Property("SccProjectName");
			this.SccLocalPathProperty = new Property("SccLocalPath");
			this.SccAuxPathProperty = new Property("SccAuxPath");
			this.SccProviderProperty = new Property("SccProvider");

			this.Properties.AddRange(new Property[] {
				this.ConfigurationProperty,
				this.PlatformProperty,
				this.ProductVersionProperty,
				this.SchemaVersionProperty,
				this.ProjectGuidProperty,
				this.OutputTypeProperty,
				this.AppDesignerFolderProperty,
				this.RootNamespaceProperty,
				this.AssemblyNameProperty,
				this.TargetFrameworkVersionProperty,
				this.FileAlignmentProperty,
				this.SccProjectNameProperty,
				this.SccLocalPathProperty,
				this.SccAuxPathProperty,
				this.SccProviderProperty
			});
		}

		/// <summary>
		/// Gets the <c>Configuration</c> property.
		/// </summary>
		public Property ConfigurationProperty { get; private set; }
		/// <summary>
		/// Gets or sets the value of the <c>Configuration</c> property.
		/// </summary>
		public string Configuration
		{
			get { return (string)this.ConfigurationProperty.Value; }
			set { this.ConfigurationProperty.Value = value; }
		}

		/// <summary>
		/// Gets the <c>Platform</c> property.
		/// </summary>
		public Property PlatformProperty { get; private set; }
		/// <summary>
		/// Gets or sets the value the <c>Platform</c> property.
		/// </summary>
		public string Platform
		{
			get { return (string)this.PlatformProperty.Value; }
			set { this.PlatformProperty.Value = value; }
		}

		/// <summary>
		/// Gets the <c>ProductVersion</c> property.
		/// </summary>
		public Property ProductVersionProperty { get; private set; }
		/// <summary>
		/// Gets or sets the value of the <c>ProductVersion</c> property.
		/// </summary>
		public string ProductVersion
		{
			get { return (string)this.ProductVersionProperty.Value; }
			set { this.ProductVersionProperty.Value = value; }
		}

		/// <summary>
		/// Gets the <c>SchemaVersion</c> property.
		/// </summary>
		public Property SchemaVersionProperty { get; set; }
		/// <summary>
		/// Gets or sets the value of the <c>SchemaVersion</c> property.
		/// </summary>
		public string SchemaVersion
		{
			get { return (string)this.SchemaVersionProperty.Value; }
			set { this.SchemaVersionProperty.Value = value; }
		}

		/// <summary>
		/// Gets the <c>ProjectGuid</c> property.
		/// </summary>
		public Property ProjectGuidProperty { get; private set; }
		/// <summary>
		/// Gets or sets the value of the <c>ProjectGuid</c> property.
		/// </summary>
		public Guid? ProjectGuid
		{
			get { return (Guid?)this.ProjectGuidProperty.Value; }
			set { this.ProjectGuidProperty.Value = value; }
		}

		/// <summary>
		/// Gets the <c>OutputType</c> property.
		/// </summary>
		public Property OutputTypeProperty { get; private set; }
		/// <summary>
		/// Gets or sets the value of the <c>OutputType</c> property.
		/// </summary>
		public string OutputType
		{
			get { return (string)this.OutputTypeProperty.Value; }
			set { this.OutputTypeProperty.Value = value; }
		}

		/// <summary>
		/// Gets the <c>AppDesignerFolder</c> property.
		/// </summary>
		public Property AppDesignerFolderProperty { get; private set; }
		/// <summary>
		/// Gets or sets the value of the <c>AppDesignerFolder</c> property.
		/// </summary>
		public string AppDesignerFolder
		{
			get { return (string)this.AppDesignerFolderProperty.Value; }
			set { this.AppDesignerFolderProperty.Value = value; }
		}

		/// <summary>
		/// Gets the <c>RootNamespace</c> property.
		/// </summary>
		public Property RootNamespaceProperty { get; private set; }
		/// <summary>
		/// Gets or sets the value of the <c>RootNamespace</c> property.
		/// </summary>
		public string RootNamespace
		{
			get { return (string)this.RootNamespaceProperty.Value; }
			set { this.RootNamespaceProperty.Value = value; }
		}

		/// <summary>
		/// Gets the <c>AssemblyName</c> property.
		/// </summary>
		public Property AssemblyNameProperty { get; private set; }
		/// <summary>
		/// Gets or sets the value of the <c>AssemblyName</c> property.
		/// </summary>
		public string AssemblyName
		{
			get { return (string)this.AssemblyNameProperty.Value; }
			set { this.AssemblyNameProperty.Value = value; }
		}

		/// <summary>
		/// Gets the <c>TargetFrameworkVersion</c> property.
		/// </summary>
		public Property TargetFrameworkVersionProperty { get; private set; }
		/// <summary>
		/// Gets or sets the value of the <c>TargetFrameworkVersion</c> property.
		/// </summary>
		public string TargetFrameworkVersion
		{
			get { return (string)this.TargetFrameworkVersionProperty.Value; }
			set { this.TargetFrameworkVersionProperty.Value = value; }
		}

		/// <summary>
		/// Gets the <c>FileAlignment</c> property.
		/// </summary>
		public Property FileAlignmentProperty { get; private set; }
		/// <summary>
		/// Gets or sets the value of the <c>FileAlignment</c> property.
		/// </summary>
		public int? FileAlignment
		{
			get { return (int?)this.FileAlignmentProperty.Value; }
			set { this.FileAlignmentProperty.Value = value; }
		}

		/// <summary>
		/// Gets the <c>SccProjectName</c> property.
		/// </summary>
		public Property SccProjectNameProperty { get; private set; }
		/// <summary>
		/// Gets or sets the value of the <c>SccProjectName</c> property.
		/// </summary>
		public string SccProjectName
		{
			get { return (string)this.SccProjectNameProperty.Value; }
			set { this.SccProjectNameProperty.Value = value; }
		}

		/// <summary>
		/// Gets the <c>SccLocalPath</c> property.
		/// </summary>
		public Property SccLocalPathProperty { get; private set; }
		/// <summary>
		/// Gets or sets the value of the <c>SccLocalPath</c> property.
		/// </summary>
		public string SccLocalPath
		{
			get { return (string)this.SccLocalPathProperty.Value; }
			set { this.SccLocalPathProperty.Value = value; }
		}

		/// <summary>
		/// Gets the <c>SccAuxPath</c> property.
		/// </summary>
		public Property SccAuxPathProperty { get; private set; }
		/// <summary>
		/// Gets or sets the value of the <c>SccAuxPath</c> property.
		/// </summary>
		public string SccAuxPath
		{
			get { return (string)this.SccAuxPathProperty.Value; }
			set { this.SccAuxPathProperty.Value = value; }
		}

		/// <summary>
		/// Gets the <c>SccProvider</c> property.
		/// </summary>
		public Property SccProviderProperty { get; private set; }
		/// <summary>
		/// Gets or sets the value of the <c>SccProvider</c> property.
		/// </summary>
		public string SccProvider
		{
			get { return (string)this.SccProviderProperty.Value; }
			set { this.SccProviderProperty.Value = value; }
		}
	}
}
